############################################################
# $Id: pgsql.p,v 1.14 2006/05/16 15:02:46 misha Exp $
# based on egr's pgsql.p
############################################################

@CLASS
pgsql

@USE
sql.p

@BASE
sql



############################################################
@auto[]
$server_name[pgsql]
#end @auto[]



############################################################
@init[sConnectString;hParam]
^BASE:init[$sConnectString;$hParam]
#end @init[]



# DATE functions

############################################################
# current date
@today[]
$result[CURRENT_DATE]
#end @today[]



############################################################
# current date and time
@now[]
$result[CURRENT_TIMESTAMP]
#end @now[]



############################################################
@year[sSource]
$result[EXTRACT(year from $sSource)]
#end @year[]



############################################################
@month[sSource]
$result[EXTRACT(month from $sSource)]
#end @month[]



############################################################
@day[sSource]
$result[EXTRACT(day from $sSource)]
#end @day[]



############################################################
@ymd[sSource]
$result[TO_CHAR($sSource,'YY-MM-DD')]
#end @ymd[]



############################################################
@time[sSource]
$result[TO_CHAR($sSource,'HH24:MI:SS')]
#end @time[]



############################################################
# days between specified dates
@date_diff[t;sDateFrom;sDateTo]
$result[^if(def $sDateTo){TO_DAYS($sDateTo)}{^self.today[]} - TO_DAYS($sDateFrom)]
#end @date_diff[]



############################################################
@date_sub[sDate;iDays]
$result[^if(def $sDate){'$sDate'}{^self.now[]} - INTERVAL '$iDays DAYS']
#end @date_sub[]



############################################################
@date_add[sDate;iDays]
$result[^if(def $sDate){'$sDate'}{^self.now[]} + INTERVAL '$iDays DAYS']
#end @date_add[]



# functions available not for all sql servers
############################################################
# MSSQL havn't anything like this
@date_format[sSource;sFormatString]
$result[TO_CHAR($sSource, '^if(def $sFormatString){$sFormatString}{YY-MM-DD}')]
#end @date_format[]




# LAST_INSERT_ID()

############################################################
# you must add column with SERIAL type and sequence created by default
@last_insert_id[sTable]
^self._execute{
	$result(^int:sql{SELECT ${sTable}_${sTable}_id_seq.currval}[$.default{0}])
}
#end @last_insert_id[]



############################################################
@set_last_insert_id[tTable;sField]
^self._execute{
	$result(^self.last_insert_id[$sTable])
	^void:sql{UPDATE $sTable SET ^if(def $sField){$sField}{sort_order} = $result WHERE ${sTable}_id = $result}
}
#end @set_last_insert_id[]



# STRING functions

############################################################
@substring[sSource;iPos;iLength]
$result[SUBSTRING($sSource,^if(def $iPos){$iPos}{1},^if(def $iLength){$iLength}{1})]
#end @substring[]



############################################################
@upper[sField]
$result[UPPER($sField)]
#end @upper[]



############################################################
@lower[sField]
$result[LOWER($sField)]
#end @lower[]



# MISC functions

############################################################
@password[sPassword]
$result[$sPassword]
#end @password[]



############################################################
@left_join[sType;sTable;sJoinConditions;last]
^switch[^sType.lower[]]{
	^case[from]{
		$result[LEFT JOIN $sTable ON ($sJoinConditions)]
	}
	^case[where]{
		$result[1 = 1 ^if(!def $last){ AND}]
	}
	^case[DEFAULT]{
		^throw[pgsql.p;Unknown join type '$sType']
	}
}
#end @left_join[]


